package com.gbb.common.chche;

import android.content.Context;

import com.gbb.common.AppUtils;
import com.gbb.common.utils.FileUtils;
import com.gbb.common.utils.Md5Util;

import java.io.File;

/**
 * <pre>
 *  设置->应用->应用详情->清除数据
 *  /data/data/<application package>/cache {@link Context#getCacheDir()}
 *  /data/data/<application package>/files {@link Context#getFilesDir()}
 * </pre>
 * <pre>
 *  设置->应用->应用详情->清除缓存
 *  SDCard/Android/data/你的应用的包名/files {@link Context#getExternalFilesDir(String)}
 *  SDCard/Android/data/你的应用包名/cache   {@link Context#getExternalCacheDir()}
 * </pre>
 * 以上两种方式：当应用卸载以后对应的数据都会被清除掉。
 * <pre>
 *   sdcard/xxx/xxx
 * </pre>
 */
public class FileManager {

    public static FileManager get(){
        return SinglePattern.instance;
    }

    /**
     * 获取当前应用存放文件的根路径，
     *
     * @return 文件根路径
     */
    public String getAppDirPath(){
        String extendPath;
        if(FileUtils.hasSdcard()) {
            String pckName = AppUtils.get().getPackageName();
            String rootPath = FileUtils.getSDCardPath() + pckName;
            extendPath = FileUtils.createFolder(rootPath);
        } else {
            extendPath = AppUtils.get().getFilesDir().getParent();
        }
        return extendPath + File.separator;
    }

    /**
     * 根据文件类型获取缓存文件夹地址，如果这个文件夹不存在就自动创建
     *
     * @param fileEnum 文件类型
     * @return 返回文件夹路径
     */
    public String getDirPath(FileEnum fileEnum){
        return FileUtils.createFolder(getAppDirPath() + fileEnum.getFilePath());
    }

    /**
     * 获取、创建临时文件
     *
     * @param fileEnum 临时文件类型
     * @param URI 可以是网络URL，可以是本地地址，也可以是普通文件名
     * @param isHasSuffix 是否带后缀名
     * @param isMD5ed URI是否经过MD5加密
     * @param isCreated 如果文件不存在是否创建
     */
    public String getTempFile(FileEnum fileEnum,String URI,boolean isHasSuffix,boolean isMD5ed,boolean isCreated){
        if(URI == null) {
            return null;
        }
        String dirPath = getDirPath(fileEnum);
        String tempFileName = isMD5ed ? Md5Util.getMD5Str(URI) : URI;
        if(fileEnum == FileEnum.IMAGE) {
            tempFileName += isHasSuffix ? ".jpg" : "_jpg";
        } else if(fileEnum == FileEnum.TEMP) {
            tempFileName += isHasSuffix ? ".temp" : "_temp";
        }
        return isCreated ? FileUtils.createFile(dirPath + tempFileName) : dirPath + tempFileName;
    }

    /**
     * 创建日期名称文件
     *
     * @param fileEnum
     * @return
     */
    public String createRandomFile(FileEnum fileEnum){
        String tempFileName = String.valueOf(System.currentTimeMillis());
        if(fileEnum == FileEnum.IMAGE) {
            tempFileName += ".jpg";
        }
        return FileUtils.createFile(getDirPath(fileEnum) + tempFileName);
    }

    /**
     * 默认不带后缀名，URI经过MD5加密
     *
     * @param isCreated 如果文件不存在是否创建
     */
    public String getTempFile(FileEnum fileEnum,String URI,boolean isCreated){
        return getTempFile(fileEnum,URI,false,true,isCreated);
    }

    /**
     * 所需缓存文件夹枚举
     */
    public enum FileEnum {

        // 图片路径
        IMAGE("image/"),

        // 录音路径
        AUDIO("audio/"),

        // 临时文件路径
        TEMP("temp/"),

        //缓存文件路径
        CACHE("cache/"),

        // 下载文件路径
        DOWNLOAD("download/");

        /** 文件路径 **/
        private String filePath;

        /**
         * 构造函数
         *
         * @param filePath 文件路径
         */
        FileEnum(String filePath){
            this.filePath = filePath;
        }

        /**
         * @return 文件路径
         **/
        public String getFilePath(){
            return filePath;
        }
    }


    /**
     * 优点1.懒加载
     * 优点2.解决多线程并发问题
     */
    private static class SinglePattern {

        final static FileManager instance = new FileManager();
    }
}
